package yxxy.c_022;

import java.util.concurrent.TimeUnit;

/**
 * ThreadLocal线程局部变量
 * <p>
 * ThreadLocal使用空间换时间，synchronized是使用时间换空间。
 * 比如在hibernate中session就存在于ThreadLocal中，避免synchronized的使用。
 * <p>
 * 运行下面程序，理解ThreadLocal
 *
 * @create: 2019-08-29 21:57
 **/
public class ThreadLocal2 {
    // 声名线程局部变量，
    // 虽然在同一个对象中，但是当某个线程在使用它时，该变量就会在线程内生成一个只有这个线程可以使用的线程内变量。
    // 当另外一个线程来使用它时，它就会在这一个线程内再生成一个只能是该线程使用的线程内变量。这里两个线程使用的就是两个不同的变量了
    static ThreadLocal<Person> tl = new ThreadLocal<>();

    public static void main(String[] args) {
        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            System.out.println(tl.get());
        }).start();

        new Thread(() -> {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            tl.set(new Person());
        }).start();
    }

    static class Person {
        String name = "张三";
    }

}
